import java.util.Date;

public class NTPUtil {

	/**
	 * 
	 * @param array
	 *            odgovor od NTP servera
	 * @param offset
	 * @return
	 */
	public static long bytesToLong(byte[] array, int offset) {
		return ((array[offset] & 0xFFL) << 24)
				+ ((array[offset + 1] & 0xFFL) << 16)
				+ ((array[offset + 2] & 0xFFL) << 8) + (array[offset + 3]);
	}

	/**
	 * 
	 * @param fraction razlomljeni deo vremena
	 * @return vreme u milisekundama
	 */
	public static int fractionToMiliseconds(long fraction) {
		return (int) (fraction / 4294967.296);
	}

	/**
	 * Pretvara dobijene sekunde i milisekunde u datum
	 * @param seconds 
	 * @param fraction
	 * @return
	 */
	public static Date dateFromTimestamp(long seconds, long fraction) {
		return new Date((seconds - 2208988800L) * 1000
				+ fractionToMiliseconds(fraction));
	}

	/**
	 * Pretvaranje trenutnog datuma u bajtove, radi slanja serveru
	 * @param d
	 * @param array u koji treba upisati bajtove
	 * @param offset na koji treba upisati
	 */
	public static void dateToBytes(Date d, byte[] array, int offset) {
		long ntpseconds = d.getTime() / 1000 + 2208988800L;
		long ntpmilis = (long) ((d.getTime() % 1000) * 4294967.296);

		array[offset + 0] = (byte) ((ntpseconds >> 24) & 0xFF);
		array[offset + 1] = (byte) ((ntpseconds >> 16) & 0xFF);
		array[offset + 2] = (byte) ((ntpseconds >> 8) & 0xFF);
		array[offset + 3] = (byte) (ntpseconds & 0xFF);

		array[offset + 4] = (byte) ((ntpmilis >> 24) & 0xFF);
		array[offset + 5] = (byte) ((ntpmilis >> 16) & 0xFF);
		array[offset + 6] = (byte) ((ntpmilis >> 8) & 0xFF);
		array[offset + 7] = (byte) (ntpmilis & 0xFF);
	}

	/**
	 * Vraca datum od timestampa, samo od sekundi
	 * @param seconds
	 * @return
	 */
	public static Date dateFromTimestamp(long seconds) {
		return new Date(seconds - 2208988800L);
	}

	/**
	 * 
	 * @param b
	 *            bajt koji treba biti pretvoren u unsigned vrednost
	 * @return unsigned vrednost bajta
	 */
	public static int fromSignedToUnsigned(byte b) {
		return b & 0xff;
	}
}
